/**
 * 
 */
package compilador.analizadorSintactico.categoriasSintacticas;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico;
import compilador.interfaces.Sentencia;

/**
 * @author Nolberto Castellanos Rodriguez
 * @author Yurani Alejandra Salamanca Lotero
 *
 * Clase que representa los bloques de sentencias
 */
public class BloqueSentencias {

//	-------------------------------------------------------------------------------------------------
//	ATRIBUTOS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Atributo que contiene las sentencias si
	 */
	private ArrayList<Sentencia> sentencias;
	
//	-------------------------------------------------------------------------------------------------
//	CONSTRUCTOR
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Constructor para crear un nuevo bloque de sentencias, una sentencia puede ser una variable, una invocacion de metodo
	 * un retorno, una sentencia de signacion, una sentencia mientras una sentencia si o una sentencia para.
	 * @param Sentencia
	 */
	public BloqueSentencias(ArrayList<Sentencia> sentencias) {
		super();
		this.sentencias = sentencias;
	}
	
//	-------------------------------------------------------------------------------------------------
//	METODOS
//	-------------------------------------------------------------------------------------------------	

	/**
	 * Metodo que permite agregar hojas al nodo de la clase
	 * @return el nodo de la clase con sus hojas
	 */
	public DefaultMutableTreeNode getArbolVisual(){
		DefaultMutableTreeNode miRaiz =  new  DefaultMutableTreeNode("Bloque de Sentencias");
		
		for (Sentencia sentencia : sentencias) 
			miRaiz.add(sentencia.getArbolVisual());
		
		return miRaiz;
	}
	
	public String getJavaCode(){
		
		String retornable = "";
		
		for (Sentencia sentencia : sentencias) {
			if(sentencia instanceof SentenciaAsignacion)
				retornable += "\t" + sentencia.getJavaCode() + ";\n";
			else
				retornable += sentencia.getJavaCode();
		}
		
		return retornable;
	}
	
	/**
	 * @param ts
	 * @param errores
	 * @param claseActual
	 * @param metodoActual
	 */
	public void AnalizarSemantica(TablaSimboloSemantico ts,	ArrayList<SimboloError> errores, String claseActual,
			String metodoActual) {
		if(sentencias != null)
			for (Sentencia sent : sentencias) 
				sent.AnalizarSemantica(ts, errores, claseActual, metodoActual);
	}
	
//	-------------------------------------------------------------------------------------------------
//	Getters & Setters
//	-------------------------------------------------------------------------------------------------

	/**
	 * Metodo que nos retorna el valor de sentencias
	 * @return  sentencias. Valor retornado
	 */
	public ArrayList<Sentencia> getSentencias() {
		return sentencias;
	}

	/**
	 * Metodo que permite asignar el valor de sentencias
	 * @param sentencias. Valor a asignar sentencias
	 */
	public void setSentencias(ArrayList<Sentencia> sentencias) {
		this.sentencias = sentencias;
	}
}
